package com.huanyang.usebitmap

import android.Manifest
import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import android.view.View
import android.widget.Button
import android.widget.ProgressBar
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.SimpleTarget
import com.bumptech.glide.request.transition.Transition
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

class PdfActivity : AppCompatActivity() {
    // PDF工具类（需使用改造后支持多图的PdfUtil）
    private val pdfUtil by lazy { PdfUtil(this) }
    // 存储多选的图片Uri列表（核心：管理所有选中的图片）
    private val selectedImageUris = mutableListOf<Uri>()
    // RecyclerView相关：多图展示的核心控件
    private lateinit var imageRecyclerView: RecyclerView
    private lateinit var imageAdapter: ImageListAdapter

    private lateinit var progressBar: ProgressBar

    // 权限/请求码（统一管理，避免混乱）
    private val REQUEST_CODE_PERMISSION = 200    // 存储权限请求码
    private val REQUEST_CODE_PICK_IMAGES = 100   // 多图选择请求码
    private val REQUEST_CODE_STORAGE = 1001      // 写存储权限请求码（仅Android 10以下用）

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_pdf)

        // 1. 初始化RecyclerView（多图展示核心，替换原错误的ImageView初始化）
        initRecyclerView()

        // 2. 「打开相册（多选）」按钮点击事件
        findViewById<TextView>(R.id.btn_select).setOnClickListener {
            requestStoragePermission() // 先请求权限，再打开相册
        }

        // 3. 「多图生成PDF」按钮点击事件（替换原单图生成逻辑）
        findViewById<Button>(R.id.btn_download).setOnClickListener {
            Log.i(TAG, "onCreate: 点击了下载pdf按钮")
            generateMultiImagePdf()
        }

        progressBar = findViewById(R.id.pg_bar)
    }

    /**
     * 初始化RecyclerView：设置网格布局+Adapter（多图展示的关键）
     */
    private fun initRecyclerView() {
        // 绑定布局中的RecyclerView（id=rc_img_list，原代码误当作ImageView）
        imageRecyclerView = findViewById(R.id.rc_img_list)
        // 网格布局：每行显示3张图（可根据需求调整列数）
        imageRecyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
        // 初始化Adapter：传入图片列表+删除回调（用户可删除选中的图）
        imageAdapter = ImageListAdapter(
            context = this,
            imageUris = selectedImageUris,
            onDeleteClick = { position ->
                // 删除逻辑：移除列表中的图片+刷新Adapter
                selectedImageUris.removeAt(position)
                imageAdapter.notifyItemRemoved(position) // 刷新删除的item
                imageAdapter.notifyItemRangeChanged(position, selectedImageUris.size) // 刷新后续item位置
            }
        )
        // 给RecyclerView设置Adapter
        imageRecyclerView.adapter = imageAdapter
    }

    /**
     * 请求存储权限（适配Android版本：10以下需读权限，10以上系统自动授权）
     */
    private fun requestStoragePermission() {
        val neededPermissions = mutableListOf<String>()

        // 仅Android 10（API 29）以下需要「读外部存储权限」
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
            if (ContextCompat.checkSelfPermission(
                    this,
                    Manifest.permission.READ_EXTERNAL_STORAGE
                ) != PackageManager.PERMISSION_GRANTED
            ) {
                neededPermissions.add(Manifest.permission.READ_EXTERNAL_STORAGE)
            }
        }

        // 有未授予的权限：弹窗请求
        if (neededPermissions.isNotEmpty()) {
            ActivityCompat.requestPermissions(
                this,
                neededPermissions.toTypedArray(),
                REQUEST_CODE_PERMISSION
            )
        } else {
            // 权限已全授予：打开多选相册
            openAlbumForMultiSelect()
        }
    }

    /**
     * 打开系统相册（支持多图选择，替换原单选逻辑）
     */
    private fun openAlbumForMultiSelect() {
        val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
        // 关键参数：允许多选（没有这行就是单选）
        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
        // 启动相册，等待返回多选结果
        startActivityForResult(intent, REQUEST_CODE_PICK_IMAGES)
    }

    /**
     * 处理相册返回结果（接收多选的图片Uri）
     */
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        // 仅处理「多图选择」的返回结果
        if (requestCode == REQUEST_CODE_PICK_IMAGES && resultCode == RESULT_OK && data != null) {
            // 情况1：多选图片（返回ClipData，包含多个Uri）
            if (data.clipData != null) {
                val clipData = data.clipData
                // 遍历ClipData，获取所有选中的图片Uri
                for (i in 0 until clipData!!.itemCount) {
                    val imageUri = clipData.getItemAt(i).uri
                    selectedImageUris.add(imageUri)
                }
            }
            // 情况2：单选图片（兼容部分手机的多选逻辑，避免选1张图时无响应）
            else if (data.data != null) {
                val imageUri = data.data
                imageUri?.let { selectedImageUris.add(it) }
            }
            // 刷新RecyclerView：显示新选中的图片
            imageAdapter.notifyDataSetChanged()
        }
    }

    /**
     * 核心逻辑：多图生成PDF（替换原单图生成逻辑）
     */
    private fun generateMultiImagePdf() {
        // 先判断是否选中图片
        if (selectedImageUris.isEmpty()) {
            Toast.makeText(this, "请先选择至少1张图片", Toast.LENGTH_SHORT).show()
            return
        }

        // 权限检查：仅Android 10以下需要「写外部存储权限」
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
            if (ContextCompat.checkSelfPermission(
                    this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE
                ) != PackageManager.PERMISSION_GRANTED
            ) {
                // 未授权：弹窗请求
                ActivityCompat.requestPermissions(
                    this,
                    arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
                    REQUEST_CODE_STORAGE
                )
                return
            }
        }

        progressBar.visibility = View.VISIBLE

        // 协程中处理：图片转Bitmap + 生成PDF（避免阻塞主线程）
            // 存储转好的Bitmap列表（每张图对应PDF的1页）
            val bitmapList = mutableListOf<Bitmap>()

            // 遍历所有选中的图片Uri，用Glide转成Bitmap（避免OOM）
            for (uri in selectedImageUris) {
                Glide.with(this@PdfActivity)
                    .asBitmap() // 明确加载为Bitmap
                    .load(uri)  // 加载图片Uri
                    .override(1080, 720)
                    .centerCrop()
                    .into(object : SimpleTarget<Bitmap>() {
                        override fun onResourceReady(
                            resource: Bitmap,
                            transition: Transition<in Bitmap>?
                        ) {
                            // 图片加载完成：添加到Bitmap列表
                            bitmapList.add(resource)

                            // 所有图片都转成Bitmap后，触发PDF生成
                            if (bitmapList.size == selectedImageUris.size) {
                                lifecycleScope.launch(Dispatchers.Main) {
                                    createPdfFromBitmaps(bitmapList)
                                }
                            }
                        }
                    })
        }
    }

    /**
     * 调用PdfUtil生成多图PDF（子协程：处理耗时操作）
     */
    private suspend fun createPdfFromBitmaps(bitmapList: List<Bitmap>) = withContext(Dispatchers.IO) {
        // 调用改造后PdfUtil的多图方法（convertBitmapsToPdf）
        val pdfPath = pdfUtil.convertBitmapsToPdf(
            bitmapList = bitmapList,
            pdfName = "${System.currentTimeMillis()}" // 动态文件名（避免重复）
        )

        // 回到主线程：提示结果+打开PDF
        withContext(Dispatchers.Main) {
            progressBar.visibility = View.GONE
            if (pdfPath != null) {
                Toast.makeText(this@PdfActivity, "PDF已保存到下载目录", Toast.LENGTH_LONG).show()
                Log.i(TAG, "多图PDF生成成功，路径：$pdfPath")

                // 用FileOpenerUtil打开生成的PDF（复用之前的工具类）
                val pdfUri = Uri.parse(pdfPath)
                FileOpenerUtil.openPdfFile(this@PdfActivity, pdfUri)
            } else {
                Toast.makeText(this@PdfActivity, "PDF生成失败", Toast.LENGTH_SHORT).show()
            }
        }
    }

    /**
     * 处理权限请求结果（统一响应所有权限请求）
     */
    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<String>,
        grantResults: IntArray
    ) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            // 「读存储权限」请求结果（打开相册用）
            REQUEST_CODE_PERMISSION -> {
                openAlbumForMultiSelect() // 不管是否授权，都尝试打开（授权失败会由系统提示）
            }
            // 「写存储权限」请求结果（Android 10以下生成PDF用）
            REQUEST_CODE_STORAGE -> {
                if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    generateMultiImagePdf() // 授权通过：重新触发PDF生成
                } else {
                    Toast.makeText(this, "需要存储权限才能保存PDF", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }

    companion object {
        private const val TAG = "PdfActivity"
    }
}